// Jenkins Job DSL 配置文件
// 用于自动创建多环境构建任务

// 定义环境配置
def environments = [
    'development': [
        'description': '开发环境构建任务',
        'schedule': 'H/30 * * * *',  // 每30分钟检查一次
        'autoTrigger': true,
        'deployAfterBuild': true
    ],
    'testing': [
        'description': '测试环境构建任务',
        'schedule': 'H 2 * * *',     // 每天凌晨2点
        'autoTrigger': false,
        'deployAfterBuild': true
    ],
    'staging': [
        'description': '预发布环境构建任务',
        'schedule': '',              // 手动触发
        'autoTrigger': false,
        'deployAfterBuild': false
    ],
    'production': [
        'description': '生产环境构建任务',
        'schedule': '',              // 手动触发
        'autoTrigger': false,
        'deployAfterBuild': false
    ]
]

// 为每个环境创建构建任务
environments.each { envName, envConfig ->
    
    pipelineJob("device-management-api-${envName}") {
        description(envConfig.description)
        
        // 参数配置
        parameters {
            choiceParam('BUILD_TYPE', ['build', 'build-test', 'build-deploy'], '构建类型')
            booleanParam('RUN_TESTS', true, '是否运行测试')
            booleanParam('DEPLOY_AFTER_BUILD', envConfig.deployAfterBuild, '构建后是否自动部署')
            stringParam('TAG_VERSION', 'latest', '镜像标签版本')
        }
        
        // 源码配置
        definition {
            cpsScm {
                scm {
                    git {
                        remote {
                            url('https://github.com/your-org/device-management-api.git')
                            credentials('github-credentials')
                        }
                        branch('*/main')
                    }
                }
                scriptPath('Jenkinsfile')
                
                // 设置环境变量
                additionalClasspath('')
                sandbox(true)
            }
        }
        
        // 构建触发器
        triggers {
            if (envConfig.schedule) {
                cron(envConfig.schedule)
            }
            
            if (envConfig.autoTrigger) {
                scm('H/5 * * * *')  // 每5分钟检查SCM变更
            }
        }
        
        // 构建环境配置
        environmentVariables {
            env('ENVIRONMENT', envName)
            env('BUILD_TYPE', 'build')
            env('DEFAULT_DEPLOY', envConfig.deployAfterBuild.toString())
        }
        
        // 构建后操作
        publishers {
            // 归档构建产物
            archiveArtifacts {
                pattern('**/*.log, coverage.xml, htmlcov/**/*')
                allowEmpty(true)
                fingerprint(true)
            }
            
            // 发布测试结果
            publishHtml {
                reportName('Coverage Report')
                reportDir('htmlcov')
                reportFiles('index.html')
                keepAll(true)
                allowMissing(false)
                alwaysLinkToLastBuild(true)
            }
        }
        
        // 权限配置
        authorization {
            permissions('hudson.model.Item.Read', ['anonymous'])
            permissions('hudson.model.Item.Build', ['developers'])
            
            if (envName == 'production') {
                permissions('hudson.model.Item.Build', ['release-managers'])
            }
        }
    }
}

// 创建多分支Pipeline任务
multibranchPipelineJob('device-management-api-multibranch') {
    description('设备管理API多分支Pipeline')
    
    branchSources {
        git {
            id('device-management-api')
            remote('https://github.com/your-org/device-management-api.git')
            credentialsId('github-credentials')
            
            // 分支发现策略
            includes('main develop feature/* release/* hotfix/*')
            excludes('experimental/*')
        }
    }
    
    // 构建配置
    configure { node ->
        node / sources / 'data' / 'jenkins.branch.BranchSource' / source / traits {
            'jenkins.plugins.git.traits.BranchDiscoveryTrait' {
                strategyId(1) // 排除已合并的分支
            }
            'jenkins.plugins.git.traits.CleanBeforeCheckoutTrait' {
                extension(class: 'hudson.plugins.git.extensions.impl.CleanBeforeCheckout')
            }
        }
    }
    
    // Jenkinsfile路径
    factory {
        workflowBranchProjectFactory {
            scriptPath('Jenkinsfile')
        }
    }
    
    // 触发器配置
    triggers {
        periodic(1) // 每分钟检查一次
    }
    
    // 孤立策略
    orphanedItemStrategy {
        discardOldItems {
            numToKeep(10)
        }
    }
}